package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.aliyuncs.exceptions.ClientException;
import com.itheima.POJO.Order;
import com.itheima.constant.MessageConstant;
import com.itheima.constant.RedisMessageConstant;
import com.itheima.entity.Result;
import com.itheima.service.orderService;
import com.itheima.utils.SMSUtils;
import com.itheima.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.Map;

@RestController
@RequestMapping("/validateCode")
public class validateCodeController {

    //jedisPool在spring容器中
    @Autowired
    private JedisPool jedisPool;

    @Reference
    private orderService orderService;


    @RequestMapping("/send4Order")
    public Result send4Order(String telephone){
        String code = ValidateCodeUtils.generateValidateCode4String(6);
        String validateCode = SMSUtils.VALIDATE_CODE;
        try {
            SMSUtils.sendShortMessage(validateCode,telephone,code);
            //成功发送验证码后将 code验证码 放到 redis中
            //我必须把这个生成的验证码保存下来,下面做表单验证判断用户是否输入正确时要用到
            //当十个用户同时发验证码的时候 我就必须把这些用户的验证码区分开来
            Jedis jedis = jedisPool.getResource();
            jedis.hset(RedisMessageConstant.SENDTYPE_ORDER,telephone,code);
            //300秒后删除 对应telephone的redis缓存
            /*
            * Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) :
              EXPlRE <key> <ttl> 命令用于将键key 的生存时间设置为ttl 秒。
              PEXPIRE <key> <ttl> 命令用于将键key 的生存时间设置为ttl 毫秒。
              EXPIREAT <key> < timestamp> 命令用于将键key 的过期时间设置为timestamp所指定的秒数时间戳。
               PEXPIREAT <key> < timestamp > 命令用于将键key 的过期时间设置为timestamp所指定的毫秒数时间戳。
            */
            jedis.expire(telephone,300);
            return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return new Result(false,MessageConstant.SEND_VALIDATECODE_FAIL);
    }

    @RequestMapping("/submit")
    public Result submitOrder(@RequestBody Map map) throws Exception {
     //   {"setmealId":"12","sex":"1","telephone":"15385692072","name":"费雪皓","idCard":"340521199706102817","validateCode":"98ff71","orderDate":"2019-12-30"}
        /*
        orderInfo.name
        orderInfo.sex
        orderInfo.telephone
        orderInfo.validateCode
        orderInfo.idCard
        orderInfo.orderDate
        */

        // 1 .先判断验证码是否出错吧
        String telephone = (String) map.get("telephone");
        String code = jedisPool.getResource().hget(RedisMessageConstant.SENDTYPE_ORDER,telephone);
        String validateCode = (String) map.get("validateCode");
        //判断验证码是否输入正确
        if (code==null&&!validateCode.equals(code)){
            return new Result(false,MessageConstant.VALIDATECODE_ERROR);
        }
        //当验证码输入正确时
        map.put("orderType", Order.ORDERTYPE_WEIXIN);
        Result result= null;
        try {
            result = orderService.submitOrder(map);
            //预约完成后 无论是否成功都需要删除 验证码的redis缓存
            jedisPool.getResource().hdel(RedisMessageConstant.SENDTYPE_ORDER,telephone);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    @RequestMapping("/findById")
    public Result findinfoByID(Integer id) throws Exception {
        /*
         <p>体检人：{{orderInfo.member}}</p>
          <p>体检套餐：{{orderInfo.setmeal}}</p>
          <p>体检日期：{{orderInfo.orderDate}}</p>
         <p>预约类型：{{orderInfo.orderType}}</p>
         */
        try {
            Map<String,String> infoMap =orderService.findinfoByID(id);

            return new Result(true,"查询成功",infoMap);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false,"查询失败");
        }
    }

    @RequestMapping("/send4Login")
    public  Result send4Login(String telephone){
       // 发送验证码 需要 验证码模板  手机号 验证码
        //验证码模板
        String validateCode = SMSUtils.VALIDATE_CODE;  //VALIDATE_CODE是验证码的模板
        //随机验证码 6为随机验证码
        String code = ValidateCodeUtils.generateValidateCode4String(6);

        try {
            SMSUtils.sendShortMessage(validateCode,telephone,code);
            //验证码发送完成后将 验证码保存到redis中 随后需要跟用户写的进行比对
            Jedis jedis = jedisPool.getResource();
            //将 手机号对应的验证码 方到map集合中
            //RedisMessageConstant.SENDTYPE_LOGIN 表示用户快速登录使用的验证码
            jedis.hset(RedisMessageConstant.SENDTYPE_LOGIN,telephone,code);
            //设置该验证码的存活时间 为300秒
            jedis.expire(telephone,300);
            //都弄好了 以后返回验证码发送成功的结果
            return  new Result(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (ClientException e) {
            e.printStackTrace();

        }
        return new Result(false,MessageConstant.SEND_VALIDATECODE_FAIL);
    }
}
